package club.service.impl;

import club.dao.ApplyMapper;
import club.pojo.Apply;
import club.service.ApplyService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * 申请服务实现类
 * 处理申请记录的业务逻辑，包括分页查询、创建申请、更新状态、删除等操作
 */
@Service
@Transactional // 开启事务管理，确保数据库操作的原子性
public class ApplyServiceImpl implements ApplyService {

    @Resource
    private ApplyMapper applyMapper;
    // 注入申请数据访问层

    /**
     * 分页查询申请记录（支持按状态筛选）
     * @param state 申请状态（可选，0-待审核，1-已通过，2-已拒绝）
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果对象，包含申请记录及分页信息
     */
    @Override
    public PageInfo<Apply> allApply(Integer state, Integer pageNum, Integer pageSize) {
        // 1. 开启分页功能
        PageHelper.startPage(pageNum, pageSize);

        // 2. 构建查询条件
        EntityWrapper<Apply> wrapper = new EntityWrapper<>();
        if (state != null && state != 0) {
            // state为0时不筛选（查询所有状态）
            wrapper.eq("state", state);
            // 添加状态条件
        }

        // 3. 执行查询
        List<Apply> list = applyMapper.selectList(wrapper);

        // 4. 封装分页结果
        return new PageInfo<>(list);
    }

    /**
     * 根据ID查询申请记录
     * @param id 申请ID
     * @return 申请对象，不存在则返回null
     */
    @Override
    public Apply findByid(Integer id) {
        return applyMapper.selectById(id);
        // 调用Mapper根据ID查询
    }

    /**
     * 更新申请记录（如审核状态）
     * @param apply 包含ID和更新字段的申请对象
     * @return 更新成功返回1，失败返回0
     */
    @Override
    public int updateApply(Apply apply) {
        return applyMapper.updateById(apply);
        // 调用Mapper根据ID更新记录
    }

    /**
     * 根据ID删除申请记录
     * @param id 申请ID
     * @return 删除成功返回1，失败返回0
     */
    @Override
    public int del(Integer id) {
        return applyMapper.deleteById(id);
        // 调用Mapper根据ID删除记录
    }

    /**
     * 创建新申请记录
     * @param apply 申请对象（需包含姓名、邮箱等必填信息）
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public Integer create(Apply apply) {
        return applyMapper.insert(apply);
        // 调用Mapper插入新记录
    }
}